package com.cate.exception;


import com.cate.result.RestResponse;
import com.cate.result.SystemCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.validation.ConstraintViolationException;
import javax.validation.ValidationException;

/**
 * @CreateTime: 2023/6/28
 * @Author: <==lhd==>
 * @Description: 全局异常处理器
 */

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 处理自定义业务异常
     *
     * @param ex - exception
     * @return - result
     */
    @ExceptionHandler(BusinessException.class)
    public RestResponse doBusinessException(BusinessException ex) {
        //记录日志
        log.error(ex.getMessage(), ex);
        //发送消息给运维
        //发送邮件给开发人员,ex对象发送给开发人员
        return new RestResponse(ex.getCode(), null, ex.getMessage());
    }


    /**
     * 参数验证异常处理
     *
     * @param ex
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public RestResponse doMethodArgumentNotValidException(MethodArgumentNotValidException ex){
        log.error(ex.getMessage(), ex);
        return new RestResponse(SystemCode.PARAMETER_VALID_ERROR.getCode(), "", ex.getBindingResult().getFieldError().getDefaultMessage());
    }


    /**
     * ValidationException
     *
     * @param ex
     * @return
     */
    @ExceptionHandler(ValidationException.class)
    public RestResponse handleValidationException(ValidationException ex) {
        // 记录日志
        log.error(ex.getMessage(), ex);
        // 发送消息给运维
        // 发送邮件给开发人员,ex对象发送给开发人员
        return new RestResponse(SystemCode.PARAMETER_VALID_ERROR.getCode(), ex.getCause().getMessage());
    }

    /**
     * 常量校验异常
     * @param ex
     * @return
     */
    @ExceptionHandler(ConstraintViolationException.class)
    public RestResponse handleConstraintViolationException(ConstraintViolationException ex) {
        // 记录日志
        log.error(ex.getMessage(), ex);
        // 发送消息给运维
        // 发送邮件给开发人员,ex对象发送给开发人员
        return new RestResponse(SystemCode.PARAMETER_VALID_ERROR.getCode(), ex.getMessage());
    }

    /**
     * 绑定校验异常
     * @param ex
     * @return
     */
    @ExceptionHandler(BindException.class)
    public RestResponse handleConstraintViolationException(BindException ex) {
        // 记录日志
        log.error(ex.getMessage(), ex);
        // 发送消息给运维
        // 发送邮件给开发人员,ex对象发送给开发人员
        return new RestResponse(SystemCode.PARAMETER_VALID_ERROR.getCode(), "参数校验错误");
    }


    /**
     * 处理未定义的异常
     *
     * @param ex - exception
     * @return - result
     */
    @ExceptionHandler(Exception.class)
    public RestResponse doOtherException(Exception ex) {
        // 记录日志
        log.error(ex.getMessage(), ex);
        // 发送消息给运维
        // 发送邮件给开发人员,ex对象发送给开发人员
        return new RestResponse(SystemCode.INNER_ERROR.getCode(), null, "系统错误！请稍后重试");
    }

}
